#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>

/*
In the cmd file, to add a Command use this format :
CommandName +Option1Name(typeArg1,..., typeArgN; min1) ... -OptionKName(typeArg1,..., typeArgP; minK) // comments

'+' before the name of an essential option and '-' before the others

If an option doesn't need any argument, you can use this format
(in this example Option1 and Option3 doesn't need any argument)

CommandName -Option1Name -Option2Name(typeArg1,..., typeArgN; min1) -Option3Name ... -OptionKName(typeArg1,..., typeArgP; minK) // comments

Example :
vector -co(float, float, float; 1) // -co is for coordinate

At use :
=> vector -co 1.5 1.5 // is right
=> vector -co char -D // is wrong
=> vector -co // is wrong too

For a command the order of its options doesn't matter but for an option the order of its arguments is important.
An option with arguments has two parts (possibly the same) the essentials arguments (they have to be specified)
and no-essentials arguments the essentials arguments are the "min" firsts arguments.
In the previous example the first argument has to be specified but not the others.
*/

typedef unsigned int uint;

class Option
{
private:
    std::string name;
    std::vector<std::string> types;
    unsigned int min;
    bool set;
    bool essential;
public:
    Option();

    setName(std::string);
    setTypes(std::vector<std::string>*);
    setAType(uint, std::string);
    setMin(uint);
    setSet(bool);
    addType(std::string);
    remType(uint); // 0 = first element
    remLastType();

    std::string getName();
    std::vector<std::string>* getTypes();
    std::string operator[](uint); // return types[i];
    uint getMin();
    uint getMax();
    bool getSet();

};

class Command
{
private:
    std::string name;
    std::vector<Option> options;
public:
    Command();

};
